Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ciao a tutti
avendo portato nella tesina un'analisi dell'algoritmo RSA, volevo affiancargli un software in VB che calcolasse gli esponenti pubblici e privati. Una cosa molto semplice eh, se pensate che sceglie i numeri primi tra soli 10 e per di più molto piccoli...
Il problema si presenta durante il calcolo dell'ultimo esponente: se faccio partire il calcolo degli esponenti con quella parte di codice "attiva", il programma va in crash e non risponde (i test sono fatti con il debug, e cosa strana NON MI SEGNALA PROBLEMI ). Se levo la parte relativa all'ultimo esponente, il programma va in run senza presentare problemi, calcolando quindi l'unico esponente che gli viene richiesto. Spero mi possiate dare una mano, perchè ci terrei a portarlo =). Ecco il codice:
Codice sorgente - presumibilmente VB.NET
PublicClass Form1
Function MCD(ByVal a AsInteger, ByVal b AsInteger)AsInteger
Dim m AsDouble
If b = 0 ThenReturn a Else
Do
m = a Mod b
a = b
b = m
Loop Until b = 0
Return a
EndFunction
PrivateSub calcola_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles calcola.Click
Dim ncas As Single
Dim p, q AsInteger
Dim vtprimi(9), n, pvt, z AsInteger
Dim pub As Single
vtprimi(0)= 29
vtprimi(1)= 31
vtprimi(2)= 37
vtprimi(3)= 41
vtprimi(4)= 43
vtprimi(5)= 47
vtprimi(6)= 53
vtprimi(7)= 59
vtprimi(8)= 61
vtprimi(9)= 67
Randomize()
ncas =Rnd()
SelectCase ncas
Case 0 To 0.099999999
p = vtprimi(0)
Case 0.1 To 0.199999999
p = vtprimi(1)
Case 0.2 To 0.299999999
p = vtprimi(2)
Case 0.3 To 0.399999999
p = vtprimi(3)
Case 0.4 To 0.499999999
p = vtprimi(4)
Case 0.5 To 0.599999999
p = vtprimi(5)
Case 0.6 To 0.699999999
p = vtprimi(6)
Case 0.7 To 0.799999999
p = vtprimi(7)
Case 0.8 To 0.899999999
p = vtprimi(8)
Case 0.9 To 1
p = vtprimi(9)
EndSelect
form_p.Text= p
ncas =Rnd()
SelectCase ncas
Case 0 To 0.099999999
q = vtprimi(0)
Case 0.1 To 0.199999999
q = vtprimi(1)
Case 0.2 To 0.299999999
q = vtprimi(2)
Case 0.3 To 0.399999999
q = vtprimi(3)
Case 0.4 To 0.499999999
q = vtprimi(4)
Case 0.5 To 0.599999999
q = vtprimi(5)
Case 0.6 To 0.699999999
q = vtprimi(6)
Case 0.7 To 0.799999999
q = vtprimi(7)
Case 0.8 To 0.899999999
q = vtprimi(8)
Case 0.9 To 1
q = vtprimi(9)
EndSelect
form_q.Text= q
n = p * q
form_n.Text= n
z =(p - 1)*(q - 1)
pvt = 2
DoWhile(MCD(z, pvt) <> 1)
pvt = pvt + 1
Loop
form_pvtexp.Text= pvt
pub = 1
DoWhile((pub * pvt)Mod z) <> 1
pub = pub + 1
Loop
form_pubexp.Text= pub
EndSub
EndClass
La funzione MCD serve per il calcolo del massimo comun divisore, utile per vedere se due numeri sono coprimi tra loro. Grazie in anticipo a tutti per le eventuali risposte
Ultima modifica effettuata da itAndy90 il 06/07/2009 alle 16:08
Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Codice sorgente - presumibilmente VB.NET
DoWhile((pub * pvt)Mod z) <> 1
pub = pub + 1
Loop
risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.
Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Codice sorgente - presumibilmente VB.NET
DoWhile((pub * pvt)Mod z) <> 1
pub = pub + 1
Loop
risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.
Facci sapere....
Ciao
Grazie Jeremy
in effetti modificando il programma in cerca dell'errore devo aver combinato un bel casino, confondendo le variabili pub e pvt. Ho corretto nel sorgente, ma si presenta un'altro problema: l'esponente pubblico mi risulta identico a quello privato...
Tra l'altro, per evitare eventuali problemi di overflow, ho abbassato i valori primi nel vettore... ma ovviamente il problema dei valori pubblici e privati persiste
Ultima modifica effettuata da itAndy90 il 04/07/2009 alle 23:24
Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.
Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.
Facci sapere...
Ciao
Grazie ^___^
Il codice l'ho aggiornato nel primo post con le correzioni opportune. Guarda, pare una cosa difficilissima in realtà le operazioni da fare per calcolare gli esponenti sono poche e sempici:
Testo quotato
Calcolare gli esponenti: 1. Si prendono due numeri primi, che chiameremo p e q
2. Si esegue il prodotto n = p * q che chiameremo modulo
3. Si calcola z = (np1 - 1)(np2 - 1)
4. Si calcola il numero pvt tale che pub sia primo rispetto a z (non devono avere fattori primi in comune) chiamato esponente pubblico
5. Si calcola il numero pub tale che (pvt * pub) mod z = 1
(pvt*pub) mod z = 1 sarebbe il resto della divisione tra (pub*pvt) e z che deve essere appunto uguale ad 1. Te lo dico non per nulla, ma perchè io da emerito tortello non capivo cosa significasse xD
Function MCD(ByVal a AsInteger, ByVal b AsInteger)AsInteger
Dim m AsDouble
If b = 0 ThenReturn a Else
Do
m = a Mod b
a = b
b = m
Loop Until b = 0
Return a
EndFunction
'...
z =(p - 1)*(q - 1)
pvt = z
DoWhile(MCD(z, pvt) <> 1)
pvt = pvt - 1
Loop
form_pvtexp.Text= pvt
pub = 1
DoWhile((pub * pvt)Mod z) <> 1
pub = pub + 1
Loop
'...
Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.
Ultima modifica effettuata da Il Totem il 05/07/2009 alle 14:07
Function MCD(ByVal a AsInteger, ByVal b AsInteger)AsInteger
Dim m AsDouble
If b = 0 ThenReturn a Else
Do
m = a Mod b
a = b
b = m
Loop Until b = 0
Return a
EndFunction
'...
z =(p - 1)*(q - 1)
pvt = z
DoWhile(MCD(z, pvt) <> 1)
pvt = pvt - 1
Loop
form_pvtexp.Text= pvt
pub = 1
DoWhile((pub * pvt)Mod z) <> 1
pub = pub + 1
Loop
'...
Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.
Cacchio Totem, hai ragione. Sto stress da esami mi sta friggendo il cervello Potrei provare partendo da pvt = z - 1... Vi faccio sapere tra poco... L'unico problema è capire se poi effettivamente i valori che mi calcola sono esatti o meno...
EDIT: Ok, il cervello mi si sta bruciando davvero. Allora, in effetti Totem il discorso che fai è giusto, ma anche quella parte di programma. I due numeri devono essere coprimi e l'esponente privato deve essere più piccolo del modulo. Ho fatto delle prove e la variabile pvt è sempre più piccolo di z (quindi non è uguale)... Il problema sono strasicuro che sia nell'ultimo blocco del programma, perchè la variabile pub parte da 1 ed arriva fino allo stesso valore di pvt... Adesso come adesso il programma non mi va in loop, ma i due esponenti hanno valore sempre identico (e mi sembra impossibile). Può darsi che l'utilizzo di numeri molto piccoli rispetto a quelli raccomandati provochi questo problema?
Ultima modifica effettuata da itAndy90 il 05/07/2009 alle 21:00
Scusate se posto due volte di fila, ma è per evitare di fare troppo casino in un post solo. Allora, il problema dove dice Totem ci sta... ma non capisco perchè entra nel ciclo una sola volta (l'exp privato è sempre uguale a z - 1...
Per quello che riguarda l'esponente pubblico, credo che dipenda dall'errore precedente. Voi avete qualche soluzione? Perchè io inizio a capirci davvero poco. Tra l'altro, l'exp. pubblico risulta uguale al privato semplicemente perchè è il privato a non essere un numero conforme alle regole dell'algoritmo, di conseguenza l'exp pubblico non può più essere un intero, ma sarà un decimale (risultava uguale perchè pvt = pub era l'unico caso in cui veniva soddisfatta la condizione di uscita del ciclo).
Sarebbe un peccato non presentare sto programmino, mi darebbe una mano a prendere uno schifosissimo 80
Ultima modifica effettuata da itAndy90 il 05/07/2009 alle 21:46
Ciao.
Quello che posso fare io è aiutarti ad individuare le *assurdità* (in senso buono) del codice ... ma la soluzione ... la devi trovare tu....perchè io proprio non saprei.
Per esempio, la funzione MCD così come è scritta....
Codice sorgente - presumibilmente VB.NET
Function MCD(ByVal a AsInteger, ByVal b AsInteger)AsInteger
Dim m AsDouble
If b = 0 ThenReturn a Else
Do
m = a Mod b
a = b
b = m
Loop Until b = 0
Return a
EndFunction
ti restituirà sempre e comunque, a prescindere dalle operazioni che fai all'interno della funzione, il valore originale di b (quello che hai passato come parametro) .... e non penso sia quello che vuoi. giusto??